let mod1 = (m, n) => {
    if (n <= m) {
        return mod1(m - n, n)
    } else {
        return m
    }
}

let mod2 =
    m => {
        return n => {
            if (n <= m) {
                return mod2(m - n, n)
            } else {
                return m
            }
        }
    };

let mod3 =
    self => {

        return m => {
            return n => {
                if (n <= m) {
                    return self(self)(m - n)(n)
                } else {
                    return m
                }
            }

        };
    };

let mod4 =
    self => {

        return m => {
            return n => {

                let f = q => {
                    if (n <= m) {
                        return q(m - n)(n)
                    } else {
                        return m
                    }
                };
                return f(self(self))
            }
        }
    };

let f = q => {
    return m => {
        return n => {
            if (n <= m) {
                // 下一步要解决这个 self(self) 问题，定义一个新的方法将
                return q(m - n)(n)
            } else {
                return m
            }
        }
    }
};

// 这就是 Y
let mod5 =
    self => {
        return m => {
            return n => {
                return f(self(self))(m)(n)
            }
        }
    }

let Y =
    f => {
        return self => {
            return m => {
                return n => {
                    return f(self(self))(m)(n)
                }
            }
        }
    };

let Y2 = (f) => {
    let g = (h) => {
        return (x) => {
            return f(h(h))(x)
        }
    }
    return g(g);
}

console.dir(
    Y2(f)(7)(4)
)
